(function ($) {
    /**
     * 获取热门网站颜色主题样式
     * @param {null|string} darkMode 是否为深色模式
     * @returns {string} 颜色主题样式
     */
    function  getHotSiteColorThemeStyle(darkMode=null) {
        let isDark;
        if(!darkMode || darkMode.length === 0){
            isDark = window.darkMode;
        } else {
            isDark = darkMode === 'dark';
        }
        return isDark ? '#833391': '#c47494';
    }

    // 更新热门标签的主题样式
    $('input[name="colorTheme"]').on('change', function () {
        $('#content .url-body > a.card .card-body.hot').css('background-color', getHotSiteColorThemeStyle($(this).val()));
    });

    /**
     * 获取点击数据
     * @returns {object} 点击统计数据
     */
    function getClickStats() {
        return JSON.parse(localStorage.getItem('websiteClickStats')) || {};
    }

    /**
     * 记录点击数据（带时间戳）
     * @param {string} url 网站URL
     */
    function recordClick(url) {
        if (!url) return;

        const stats = getClickStats();
        stats[url] = stats[url] || {
            count: 0,
            lastClicked: 0,
            firstClicked: Date.now()
        };

        // 更新点击数据
        stats[url].count++;
        stats[url].lastClicked = Date.now();

        localStorage.setItem('websiteClickStats', JSON.stringify(stats));
    }

    /**
     * 获取带时间衰减的有效点击次数
     * @param {string} url 网站URL
     * @param {number} halfLifeDays 半衰期（默认30天）: 14 - 内容更新快（如新闻站）| 60 - 内容稳定（如文档站）
     * @returns {number} 有效点击值（保留1位小数）
     * 【算法原理】 新热门内容能快速获得高分，旧内容会随时间自然"冷却"，超高点击不会过度影响系统
     * 1. 使用对数函数压缩点击次数，避免高频点击支配结果
     * 2. 应用指数衰减模型，降低旧点击的权重
     * 3. 最终得分 = log10(点击次数+1) * 10 * (0.5 ^ (天数/半衰期))
     */
    function getEffectiveClicks(url, halfLifeDays = 30) {
        // 获取存储的所有点击统计
        const stats = getClickStats();

        // 如果该URL无记录，返回0分
        if (!stats[url]) return 0;

        // 计算时间衰减（指数衰减公式）- 计算自最后一次点击至今的天数
        // 公式：(当前时间 - 最后点击时间) / 毫秒数/天
        const daysPassed = (Date.now() - stats[url].lastClicked) / (1000 * 86400);

        // 计算衰减因子（半衰期公式）
        // 当 daysPassed = halfLifeDays 时，衰减因子为0.5
        const decayFactor = 0.5**(daysPassed / halfLifeDays);

        // 基础分计算
        // 使用log10(点击次数+1)：
        // - +1 避免对0取对数
        // - 对数函数压缩数值范围，使点击次数增长影响递减
        // - *10 将分数放大到更易读的范围
        const baseScore = Math.log10(stats[url].count + 1) * 10;

        // 时间衰减分 = 基础分 × 衰减因子
        const timeScore = baseScore * decayFactor;

        // 四舍五入保留1位小数
        return Math.round(timeScore * 10) / 10; // 保留1位小数
    }

    const DYNAMIC_THRESHOLD_CONFIG = {
        minThreshold: 10,      // 最低阈值
        percentile: 0.2,       // 前20%作为阈值基准
        minDataPoints: 5       // 最少需要5个有效数据点
    };

    /**
     * 智能计算动态阈值
     * @returns {number} 当前阈值
     * 【算法逻辑】
     * 1. 获取所有URL的有效点击值（经过时间衰减处理）
     * 2. 当数据量不足(<5)时返回默认阈值10
     * 3. 否则取前20%的有效点击值作为阈值
     * 4. 最终阈值不低于10（保底值）
     */
    function getDynamicThreshold() {
        // 获取所有点击统计数据
        const stats = getClickStats();

        // 计算每个URL的有效点击值（应用时间衰减）
        const effectiveClicks = Object.keys(stats).map(url =>
            getEffectiveClicks(url) // 调用衰减计算函数
        ).filter(Boolean); // 过滤掉0值（未达标的URL）

        // 数据量不足时返回默认阈值
        if (effectiveClicks.length < DYNAMIC_THRESHOLD_CONFIG.minDataPoints) {
            return  DYNAMIC_THRESHOLD_CONFIG.minThreshold; // 默认阈值
        }

        // 降序排序有效点击值（从高到低）
        effectiveClicks.sort((a, b) => b - a);

        // 计算前20%位置的索引，示例: 10个URL => 10 * 0.2=2 => 取索引2的值（第3高的分数）
        const top20Index = Math.floor(effectiveClicks.length * DYNAMIC_THRESHOLD_CONFIG.percentile);

        // 确保阈值不低于10（避免因数据分布导致阈值过低）
        return Math.max(
            effectiveClicks[top20Index], // 前20%的边界值
            DYNAMIC_THRESHOLD_CONFIG.minThreshold  // 保底最小值
        );
    }

    /**
     * 清理过期数据（1年前）
     */
    function cleanOldData() {
        const stats = getClickStats();
        const oneYearAgo = Date.now() - 365 * 86400 * 1000;

        Object.keys(stats).forEach(url => {
            if (stats[url].lastClicked < oneYearAgo) {
                delete stats[url];
            }
        });

        localStorage.setItem('websiteClickStats', JSON.stringify(stats));
    }

    /**
     * 更新热门标签
     */
    function updateHotTags() {
        // 清空已有的热门标签
        $('#content .url-body > a.card .text-sm').find('i.icon-hot').remove();
        // 获取当前阈值
        const threshold = getDynamicThreshold();
        // 添加热门标签
        $('#content .url-body > a.card').filter((index, element) => {
            const url = $(element).attr('href')?.trim();
            const effectiveClicks = getEffectiveClicks(url);
            // console.debug(url, effectiveClicks, threshold);
            return url && effectiveClicks >= threshold;
        }).find('.card-body').addClass('hot').css('background-color', getHotSiteColorThemeStyle())
        .find('.text-sm strong').after(`<i class="iconfont icon-hot ml-2" style="color: #dc3545"></i>`);
    }

    // 事件委托优化（减少内存占用）
    $(document).on('click', '.url-card a[href], .top-sites a[href], #word .search-web', function(e) {
        const url = $(this).attr('href');

        // 阻止默认跳转
        e.preventDefault();

        // 防抖处理（避免快速重复点击）
        clearTimeout($(this).data('timer'));
        $(this).data('timer', setTimeout(() => {
            recordClick(url);
            updateTopRecommendations();
            // 跳转至目标页面
            const newWindow = window.open('', '_blank');
            newWindow.location.href = url;
        }, 300));
        updateHotTags();
    });

    /**
     * 获取热门推荐站点（综合点击量和时间衰减）
     * @param {number} minClicks - 最低点击门槛（默认3次）
     * @param {number} maxSites - 最大推荐数量（默认6个）
     * @param {number} halfLifeDays - 半衰期天数（默认30天）
     * @returns {Array} 推荐站点列表 [{url, title, score}]
     */
    function getTopSites(minClicks = 3, maxSites = 6, halfLifeDays = 30) {
        return Object.entries(getClickStats())
            // 阶段1：基础过滤
            .filter(([_, item]) => {
                // 条件1：达到最低点击量
                const meetMinClicks = item.count >= minClicks;
                // 条件2：30天内活跃（可选）
                const isRecent = (Date.now() - item.lastClicked) < 30 * 86400 * 1000;
                return meetMinClicks && isRecent;
            })
            // 阶段2：智能评分
            .map(([url, item]) => {
                // 综合评分 = 点击量 + 时间衰减 + 多样性因子
                const clickScore = Math.log10(item.count + 1);
                const timeDecay = 0.9**((Date.now() - item.lastClicked) / (halfLifeDays * 86400 * 1000));
                const diversityBonus = 1 + (Math.random() * 0.2); // 10-20%随机波动防重复

                return {
                    url,
                    data: item,
                    score: (clickScore * timeDecay * diversityBonus).toFixed(2)
                };
            })
        // 阶段3：排序和截取
        .sort((a, b) => b.score - a.score)
        .slice(0, maxSites) || [];
    }

    // 动态渲染推荐栏（带淡入动画）
    function updateTopRecommendations() {
        const $topRecommendations = $('.top-recommendations');
        const topSites = getTopSites();

        if (topSites.length === 0) return;

        const $container = $topRecommendations.length ?
            $topRecommendations :
            $('<div class="top-recommendations">').prependTo('#bulletin_box');

        const $existingSites = $container.find('.top-sites');

        if ($existingSites.length) {
            // 仅更新现有内容
            $existingSites.html(
                topSites.map(({url, data}) => {
                    const firstVisit = window.AppUtils.formatDateTime(data.firstClicked);
                    const lastVisit = window.AppUtils.formatDateTime(data.lastClicked);
                    return `
                        <a href="${url}" target="_blank" class="badge "
                            title="📌 首次访问: ${firstVisit}，最后访问: ${lastVisit}">
                            ${new URL(url)} <span>${data.count}次</span>
                        </a>
                    `;
                }).join(''))
        }
        else {
            // 首次创建完整结构
            $container.html(`
                <div class="top-sites">
                    ${topSites.map(({url, data}) =>  {
                        const firstVisit = window.AppUtils.formatDateTime(data.firstClicked);
                        const lastVisit = window.AppUtils.formatDateTime(data.lastClicked);
                        return `
                            <a href="${url}" target="_blank" class="badge"
                                title="📌 首次访问: ${firstVisit}，最后访问: ${lastVisit}">
                                ${new URL(url)} <span>${data.count}次</span>
                            </a>
                        `
                    }).join('')}
                </div>
            `).hide().fadeIn(500);
        }
    }

    // 初始化
    updateTopRecommendations();
    cleanOldData();
    updateHotTags();
})(window.jQuery);